package com.ruoyi;

import com.rfid.AppNotifyImpl.MRfidReaderNotifyImpl;
import com.rfid.reader.MRfidReader;
import com.rfid.reader.RfidReader;
import com.rfid.transport.TransportThreadManager;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.ApplicationListener;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 启动程序
 *
 * @author ruoyi
 */
@EnableTransactionManagement
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class RuoYiApplication
{
//    private static volatile ScheduledExecutorService scheduler;
//    private static ConfigurableApplicationContext applicationContext;

    public static void main(String[] args)
    {
        SpringApplication.run(RuoYiApplication.class, args);
        System.err.println("项目启动成功");
//        try {
//            applicationContext = SpringApplication.run(RuoYiApplication.class, args);
//            System.err.println("项目启动成功");
//
//            // 注册关闭钩子
//            applicationContext.addApplicationListener((ApplicationListener<ContextClosedEvent>) event -> {
//                shutdownTcpClient();
//            });
//
//            startTcpClientWithReconnect();
//
//        }catch (Exception ex)
//        {
//            ex.printStackTrace();
//        }
    }

//    public static void startTcpClientWithReconnect() {
//        // 如果已经有调度器在运行，则先关闭
//        if (scheduler != null && !scheduler.isShutdown()) {
//            scheduler.shutdown();
//        }
//
//        scheduler = Executors.newScheduledThreadPool(1);
//
//        Runnable connectTask = new Runnable() {
//            @Override
//            public void run() {
//                try {
//                    TcpClientTest();
//                } catch (Exception e) {
//                    System.out.println("连接读写器失败，将在5秒后重试...");
//                    e.printStackTrace();
//                }
//            }
//        };
//
//        // 立即执行一次，并且每5秒重试一次（如果失败）
//        scheduler.scheduleWithFixedDelay(connectTask, 0, 5, TimeUnit.SECONDS);
//    }
//
//    // 添加优雅关闭的方法
//    public static void shutdownTcpClient() {
//        if (scheduler != null && !scheduler.isShutdown()) {
//            scheduler.shutdown();
//            try {
//                if (!scheduler.awaitTermination(5, TimeUnit.SECONDS)) {
//                    scheduler.shutdownNow();
//                }
//            } catch (InterruptedException e) {
//                scheduler.shutdownNow();
//                Thread.currentThread().interrupt();
//            }
//        }
//    }
//
//    public static void TcpClientTest() throws Exception{
//        System.out.println("Start a TCP transport test.");
//        TransportThreadManager.initilizeTransportManager();
//        TransportThreadManager manager = TransportThreadManager.getInstance();
//        RfidReader reader = new MRfidReader();
//        RfidReader reader2 = new MRfidReader();
//        MRfidReaderNotifyImpl notify = new MRfidReaderNotifyImpl();
//        //先设置读写器的网口为TCP Server模式，然后填写对端监听的IP和端口
//        try {
//            int result = reader.ConnectPhysicalInterface("192.168.10.7", 12345, null, 0, RfidReader.CONNECT_TYPE_NET_TCP_CLIENT);
//            if (0 == result) {
//                System.out.println("connet to the reader is ok, and the app will receive data.");
//            } else {
//                System.out.println("Fail to the reader is ok, please check the address of the reader.");
//                return;
//            }
//            reader.setAppNotify(notify);
//            manager.AddRfidReader(reader);
//        }catch (Exception ex)
//        {
//            System.out.println("Please check the address of the reader.");
//            ex.printStackTrace();
//        }
//
//        /*
//        //如果要连接到多个读写器
//        try {
//            int result = reader2.ConnectPhysicalInterface("192.168.2.166", 12346, null, 0, RfidReader.CONNECT_TYPE_NET_TCP_CLIENT);
//            if (0 == result) {
//                System.out.println("connet to the reader is ok, and the app will receive data.");
//            } else {
//                System.out.println("Fail to the reader is ok, please check the address of the reader.");
//                return;
//            }
//            reader2.setAppNotify(notify);
//            manager.AddRfidReader(reader2);
//        }catch (Exception ex)
//        {
//            System.out.println("Please check the address of the reader.");
//            ex.printStackTrace();
//        }
//        */
//
//        //如果让设备自动读卡就设置为true,其余功能测试则为false
//        boolean isInventoryTest = true;
//        if (isInventoryTest){
//            //设备重启,也作为开始读卡用
//            //如果工作模式不是主动模式则不会读卡上报数据
//            reader.Reset();
//            while(true) {
//                Thread.sleep(3000);
//                //reader.RelayControl(1,1,3);	//打开继电器1后3秒自动关闭
//                //reader.RelayControl(1,0,0);	//关闭继电器1
//                //reader.RelayControl(2,1,3);	//打开继电器2后3秒自动关闭
//                //reader.RelayControl(2,0,0);	//关闭继电器2
//                //reader.RelayControl(3,1,5);	//打开继电器1，2后5秒钟自动关闭
//                //reader.RelayControl(1,1,3);	//关闭继电器1和2
//
//            }
//        }
//        else {
//            //做如下功能的时候最好不要让设备读标签
//            reader.Stop();
//            int result = 0;
//
//            //写卡相关参数定义
//            int writeCount = 0;
//            byte writelen = 2;
//            byte[] writtenData = new byte[writelen *  2];
//
//            while(true) {
//                Thread.sleep(3000);
//				/*
//				//停止读卡功能测试
//				reader.Stop();
//				*/
//
//                /*
//				//写标签数据
//                writeCount++;
//                writtenData[0] = (byte)(writeCount >> 24);
//                writtenData[1] = (byte)(writeCount >> 16);
//                writtenData[2] = (byte)(writeCount >> 8);
//                writtenData[3] = (byte)writeCount;
//
//                //写入EPC，注意EPC的起始地址从2开始，前面存储的是标签数据的长度校验等信息，不建议修改
//                //用户区的数据起始地址为0
//				//reader.WriteTagBlock((byte)RfidReader.MEMBANK_EPC, (byte)2, (byte)2, writtenData, 0,NULL);
//                System.out.println("Write Data:"+Integer.toHexString(writtenData[0] & 0xFF)+" "+Integer.toHexString(writtenData[1] & 0xFF) + " "+Integer.toHexString(writtenData[2] & 0xFF) +" "+Integer.toHexString(writtenData[3] & 0xFF));
//                reader.WriteTagBlock(MRfidReader.MEMBANK_EPC,2,writelen,writtenData,0,null);
//                * */
//
//
//
//                //读取用户区中起始地址为0，长度为2个字的数据
//                reader.ReadTagBlock((byte)RfidReader.MEMBANK_EPC, (byte)2, (byte)2,null);
//
//
//                //锁定EPC区，这里不建议做测试
//                //reader.LockTag((byte)0x02,null);
//
//                //销毁标签
//                //reader.KillTag();
//
//                /*
//                //通过主动发命令的方式盘寻一次标签
//                reader.InventoryOnce();
//                */
//            }
//        }
//    }

}
